-- 2022-8-5

---[[10.1
    -- 编写一个split函数，接收两个参数，第一个是字符串，第二个是分隔符模式，返回每一部分
    do
        function Split(input,delimiter)
            input = tostring(input)
            delimiter = tostring(delimiter)
            local pos,arr = 0,{}
            if(delimiter == "") then
                return nil
            end 
            for b, e in function () return string.find(input,delimiter,pos,true) end do
                table.insert(arr,string.sub(input,pos,b-1))
                pos = e+1
            end
            table.insert(arr,string.sub(input,pos,-1))
            return arr
        end
        local a = "123 32123455634"
        for key, value in pairs(Split(a,"23")) do
            print(key,value)
        end
    end
--]]

---[[10.2
    -- %D和[^%d]等价，判断[^%d%u]和[%D%U]等不等价

    s = "we2 dg2 4 SSDa1 we23 wdq2fe4g4r3rg3"
    print(string.gsub(s,"%D","-"))
    print(string.gsub(s,"[^%d]","-"))
    print(string.gsub(s,"[^%d%u]","-")) -- 相当于 先去并集然后取反
    print(string.gsub(s,"[%D%U]","-")) -- 相当于 先各自取反然后取并集
    -- %D和[^%d]等价，[^%d%u]不等价于[%D%U]
--]]

---[[10.3
    -- 编写函数transliterate 接收两个参数，第一个是字符串 第二个是表 将字符串中出现的表中的键转换为表的值
    -- 如果表中键的值为false 那么移除该字符
    function Transliterate(s,tab)
        if(tab == nil) then
            return nil
        end
        for key, value in pairs(tab) do
            if nil ~= string.match(s,key) then
                if value ~= false then
                    s = string.gsub(s,key,value)
                    print("enter")
                else
                    s = string.gsub(s,key,"")
                    print("en2")
                end
            end
        end
        return s
    end
    print(Transliterate("qw wew weqwe rqrq",{qw="hhh",rqrq=false}))
--]]

---[[10.5
    -- 使用转义序列\x编写一个函数，将一个二进制字符串格式化为Lua语言中的字符常量
    function Escape(s)
       s = string.gsub(s,"\\(%d+)",function (x)
            return string.format("\\%x",string.byte(x))
       end)
       s = string.gsub(s,"(%a)",function (x)
            return string.format("\\%x",string.byte(x))
       end)
       return s
    end
    print(Escape("\\0\\1hello\\200"))
--]]